package org.lhh.server.core.codec.cluster;

import lombok.Data;
import org.lhh.server.common.utils.CollectionUtils;
import org.lhh.server.core.codec.slave.SlaveServerCodec;
import org.pentaho.di.cluster.ClusterSchema;
import org.pentaho.di.repository.LongObjectId;

import java.util.ArrayList;
import java.util.List;


/**
 * @author 辉仔
 * @since 2019-12-30
 */
@Data
public class ClusterSchemaCodec {

    private Long id;
    private String name;
    private String base_port;
    private String sockets_buffer_size;
    private String sockets_flush_interval;
    private Integer sockets_compressed;
    private Integer dynamic;
    private List<SlaveServerCodec> slaveList = new ArrayList<>();

    public static ClusterSchemaCodec encode(ClusterSchema clusterSchema) {
        ClusterSchemaCodec clusterSchemaCodec = new ClusterSchemaCodec();
        clusterSchemaCodec.setId(Long.valueOf(clusterSchema.getObjectId().getId()));
        clusterSchemaCodec.setName(clusterSchema.getName());
        clusterSchemaCodec.setBase_port(clusterSchema.getBasePort());
        clusterSchemaCodec.setSockets_buffer_size(clusterSchema.getSocketsBufferSize());
        clusterSchemaCodec.setSockets_flush_interval(clusterSchema.getSocketsFlushInterval());
        clusterSchemaCodec.setSockets_compressed(clusterSchema.isSocketsCompressed() ? 1 : 0);
        clusterSchemaCodec.setDynamic(clusterSchema.isDynamic() ? 1 : 0);
        List<SlaveServerCodec> slaveServerCodecs = SlaveServerCodec.encode(clusterSchema.getSlaveServers());
        clusterSchemaCodec.setSlaveList(slaveServerCodecs);
        return clusterSchemaCodec;
    }

    public static List<ClusterSchemaCodec> encode(List<ClusterSchema> clusterSchemas) {
        List<ClusterSchemaCodec> clusterSchemaCodecs = new ArrayList<>();
        if (!CollectionUtils.isEmpty(clusterSchemas)) {
            for (ClusterSchema clusterSchema : clusterSchemas) {
                clusterSchemaCodecs.add(encode(clusterSchema));
            }
        }
        return clusterSchemaCodecs;
    }

    public static ClusterSchema decode(ClusterSchemaCodec clusterSchemaCodec) {
        ClusterSchema clusterSchema = new ClusterSchema();
        if (clusterSchemaCodec.getId() != null)
            clusterSchema.setObjectId(new LongObjectId(clusterSchemaCodec.getId()));
        clusterSchema.setName(clusterSchemaCodec.getName());
        clusterSchema.setBasePort(clusterSchemaCodec.getBase_port());
        clusterSchema.setSocketsBufferSize(clusterSchemaCodec.getSockets_buffer_size());
        clusterSchema.setSocketsFlushInterval(clusterSchemaCodec.getSockets_flush_interval());
        clusterSchema.setSocketsCompressed(clusterSchemaCodec.getSockets_compressed() == 1);
        clusterSchema.setDynamic(clusterSchemaCodec.getDynamic() == 1);
        clusterSchema.setSlaveServers(SlaveServerCodec.decode(clusterSchemaCodec.getSlaveList()));
        return clusterSchema;
    }

    public static List<ClusterSchema> decode(List<ClusterSchemaCodec> clusterSchemaCodecs) {
        List<ClusterSchema> clusterSchemas = new ArrayList<>();
        if (!CollectionUtils.isEmpty(clusterSchemaCodecs)) {
            for (ClusterSchemaCodec clusterSchemaCodec : clusterSchemaCodecs) {
                clusterSchemas.add(decode(clusterSchemaCodec));
            }
        }
        return clusterSchemas;
    }
}
